/**
 * @description template controller
 */

const {
  findTemplateList,
  updateTemplates,
  getTemplateCount,
  getCopiedCount,
  getCreatedAndCopiedCountMonthly
} = require('../service/template')

const { SuccessRes, ErrorRes } = require('../res-model/index')
const { updateFailInfo, pageIndexFailInfo } = require('../res-model/failInfo')
const { parseNumberArr } = require('../utils/util')

/**
 * 查询模板列表
 * @param {string} keyword 搜索关键字
 */
async function getTemplateList(keyword = '', pageIndex, pageSize) {
  if (pageIndex && parseInt(pageIndex) <= 0) {
    return new ErrorRes(pageIndexFailInfo)
  }

  let whereOpt = {}
  if (keyword) {
    const keywordOpt = { $regex: keyword, $options: 'i' } //$regex 正则，用于实现模糊查询  $options: 'i' 忽略大小写

    whereOpt = {
      // 所有查询条件，$or 拼接
      $or: [{ title: keywordOpt }, { author: keywordOpt }]
    }

    const idKeyword = parseInt(keyword)
    // Number.isFinite()函数检查变量是否为数字，还检查其是否为有限值
    if (Number.isFinite(idKeyword)) {
      whereOpt.$or.push({ id: idKeyword })
    }
  }

  const pageOpt = {
    ...(pageIndex && { pageIndex: parseInt(pageIndex) - 1 }),
    ...(pageSize && { pageSize: parseInt(pageSize) })
  }

  const res = await findTemplateList(whereOpt, pageOpt)
  return new SuccessRes(res)
}

/**
 * 设置 isPublic
 * @param {string} ids 如 '1' '1,2,3'
 * @param {boolean} isPublic isPublic
 */
async function updateIsPublic(ids = '', isPublic = false) {
  // 将 ids 字符串变为数组
  const idsArr = parseNumberArr(ids)
  if (idsArr.length === 0) return new ErrorRes(updateFailInfo)

  const result = await updateTemplates({ $set: { isPublic } }, { id: { $in: idsArr } })
  if (result) return new SuccessRes()
  return new ErrorRes(updateFailInfo)
}

/**
 * 设置 isHot
 * @param {string} ids 如 '1' '1,2,3'
 * @param {boolean} isHot isHot
 */
async function updateIsHot(ids = '', isHot = false) {
  // 将 ids 字符串变为数组
  const idsArr = parseNumberArr(ids)
  if (idsArr.length === 0) return new ErrorRes(updateFailInfo)

  const result = await updateTemplates({ $set: { isHot } }, { id: { $in: idsArr } })
  if (result) return new SuccessRes()
  return new ErrorRes(updateFailInfo)
}

/**
 * 设置 orderIndex
 * @param {string} ids 如 '1' '1,2,3'
 * @param {number} orderIndex orderIndex
 */
async function updateOrderIndex(ids = '', orderIndex = 0) {
  // 将 ids 字符串变为数组
  const idsArr = parseNumberArr(ids)
  if (idsArr.length === 0) return new ErrorRes(updateFailInfo)

  const result = await updateTemplates({ $set: { orderIndex } }, { id: { $in: idsArr } })
  if (result) return new SuccessRes()
  return new ErrorRes(updateFailInfo)
}

/**
 * 获取总数
 */
async function getCount() {
  const count = await getTemplateCount()
  const copiedResult = await getCopiedCount()
  const obj = copiedResult[0] || {}

  return new SuccessRes({
    count,
    use: obj.copiedCount || 0
  })
}

/**
 * 按月统计创建和使用量
 */
async function getMonthlyCount() {
  // 一年的时间范围
  const d = new Date()
  const startTime = new Date(d.getTime() - 365 * 24 * 60 * 60 * 1000) // 一年之前
  const endTime = d

  // 获取使用的数量
  const result = await getCreatedAndCopiedCountMonthly(startTime, endTime)
  // console.log('result', result)

  // 格式化数据
  const resDataObj = {}
  result.forEach(item => {
    const { _id, count = 0, copiedCount = 0 } = item || {}
    if (!_id) return
    if (resDataObj[_id] == null) resDataObj[_id] = {}

    const data = resDataObj[_id]
    data.count = count
    data.use = copiedCount
  })

  const _idKeys = Object.keys(resDataObj)
  const resData = _idKeys.map(_id => {
    return {
      month: _id,
      data: resDataObj[_id]
    }
  })

  return new SuccessRes(resData)
}

module.exports = {
  getTemplateList,
  updateIsPublic,
  updateIsHot,
  updateOrderIndex,
  getCount,
  getMonthlyCount
}
